//给你两个整数 numBottles 和 numExchange 。 
//
// numBottles 代表你最初拥有的满水瓶数量。在一次操作中，你可以执行以下操作之一： 
//
// 
// 喝掉任意数量的满水瓶，使它们变成空水瓶。 
// 用 numExchange 个空水瓶交换一个满水瓶。然后，将 numExchange 的值增加 1 。 
// 
//
// 注意，你不能使用相同的 numExchange 值交换多批空水瓶。例如，如果 numBottles == 3 并且 numExchange == 1 ，则
//不能用 3 个空水瓶交换成 3 个满水瓶。 
//
// 返回你 最多 可以喝到多少瓶水。 
//
// 
//
// 示例 1： 
// 
// 
//输入：numBottles = 13, numExchange = 6
//输出：15
//解释：上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值，以及累计喝掉的水瓶数量。
// 
//
// 示例 2： 
// 
// 
//输入：numBottles = 10, numExchange = 3
//输出：13
//解释：上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值，以及累计喝掉的水瓶数量。 
//
// 
//
// 提示： 
//
// 
// 1 <= numBottles <= 100 
// 1 <= numExchange <= 100 
// 
//
// Related Topics 数学 模拟 👍 13 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-10-02 11:22:23
 * @description 3100.换水问题 II
 */
public class WaterBottlesIi{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 WaterBottlesIi fun=new WaterBottlesIi();
	 	 Solution solution = fun.new Solution();

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {

    public int maxBottlesDrunk1(int numBottles, int numExchange) {
        int ans=0;
		for (int empty = numBottles; empty >= numExchange ; numExchange++) {
			ans++;
			// 空瓶每次减少numsExchange个，然后喝完会多一个
			empty-=numExchange-1;
		}
		return ans;
    }
	//数学，设交换次数为t，交换总空瓶数为empty，产生的总空瓶为total，empty<=total
	public int maxBottlesDrunk(int numBottles, int numExchange) {
		int t = 0;
		//等差数量求和 a1*n+(n-1)*n/2*d
		int empty = t * numExchange + t * (t - 1) / 2;
		int total = numBottles + t;
		//得到二次方程  t*numExchange+t(t-1)/2-(numBottles+t)<=0,求根公式得到t
		int a = 1;
		int b = 2 * numExchange - 3;
		int c = -2 * numBottles;
		t = (int) Math.ceil(((-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a)));
		return numBottles + t - 1;
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
